import asyncio
import websockets
import json
import subprocess
import os

# WebSocket服务器端口
WS_PORT = 8765

# 连接的客户端列表
connected_clients = set()

# 处理点击事件
def handle_click_event(x, y):
    try:
        # 使用adb发送点击事件到手机
        # 这里假设手机已经通过adb连接
        # 注意：需要知道手机屏幕的实际分辨率，这里使用1080p作为默认值
        # 实际应用中可能需要动态获取手机分辨率
        screen_width = 1080
        screen_height = 1920
        
        # 计算实际点击坐标
        actual_x = int(x * screen_width)
        actual_y = int(y * screen_height)
        
        # 发送点击命令
        subprocess.run(
            ['adb', 'shell', 'input', 'tap', str(actual_x), str(actual_y)],
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        
        print(f"点击事件已发送: x={actual_x}, y={actual_y}")
        return True
    except Exception as e:
        print(f"发送点击事件失败: {e}")
        return False

# 处理WebSocket消息
async def handle_message(websocket, path):
    # 将新连接的客户端添加到列表
    connected_clients.add(websocket)
    print(f"新客户端已连接，当前连接数: {len(connected_clients)}")
    
    try:
        # 持续接收消息
        async for message in websocket:
            try:
                # 解析JSON消息
                data = json.loads(message)
                
                # 处理不同类型的事件
                if data.get('type') == 'click':
                    # 处理点击事件
                    success = handle_click_event(data.get('x', 0), data.get('y', 0))
                    
                    # 发送响应
                    await websocket.send(json.dumps({
                        'type': 'click_response',
                        'success': success
                    }))
                else:
                    # 未知事件类型
                    print(f"未知事件类型: {data.get('type')}")
            except json.JSONDecodeError:
                print(f"无效的JSON消息: {message}")
            except Exception as e:
                print(f"处理消息时出错: {e}")
    finally:
        # 客户端断开连接时从列表中移除
        connected_clients.remove(websocket)
        print(f"客户端已断开连接，当前连接数: {len(connected_clients)}")

# 发送广播消息给所有客户端
async def broadcast_message(message):
    if connected_clients:
        await asyncio.gather(
            *[client.send(message) for client in connected_clients]
        )

# 启动WebSocket服务器
async def start_websocket_server():
    # 创建服务器
    server = await websockets.serve(
        handle_message,
        "0.0.0.0",
        WS_PORT
    )
    
    print(f"WebSocket服务器已启动，端口: {WS_PORT}")
    
    # 保持服务器运行
    async with server:
        await server.wait_closed()

# 检查ADB是否可用
def check_adb_available():
    try:
        result = subprocess.run(
            ['adb', 'version'],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        return result.returncode == 0
    except Exception:
        return False

# 检查是否有设备连接
def check_device_connected():
    try:
        result = subprocess.run(
            ['adb', 'devices'],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True
        )
        # 检查输出中是否有设备
        output_lines = result.stdout.strip().split('\n')
        # 第一行是标题，后面的行是设备列表
        return len(output_lines) > 1 and any('device' in line for line in output_lines[1:])
    except Exception:
        return False

if __name__ == "__main__":
    # 检查ADB是否可用
    if not check_adb_available():
        print("错误: 未找到ADB工具。请确保Android SDK已安装并将adb添加到系统路径中。")
        exit(1)
    
    # 检查设备是否连接
    if not check_device_connected():
        print("警告: 未检测到已连接的Android设备。请确保设备已通过USB连接并已启用USB调试。")
    
    # 启动WebSocket服务器
    try:
        asyncio.run(start_websocket_server())
    except KeyboardInterrupt:
        print("WebSocket服务器已停止")
    except Exception as e:
        print(f"服务器异常: {e}")